From e2fdff4f13e05a5e911a2ab0ce5c386f795dace8 Mon Sep 17 00:00:00 2001 From: PegoraroF10 Date: Sat, 6 Dec 2025 08:54:05 -0300 Subject: [PATCH] Function pg_get_publication_tables is too slow, changed to pg_publication_rel and pg_publication --- src/backend/replication/logical/tablesync.c | 32 ++++++++++----------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index 6bb0cbeedad..1ba8261308c 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -799,16 +799,14 @@ fetch_remote_table_info(char *nspname, char *relname, LogicalRepRelation *lrel, */ resetStringInfo(&cmd); appendStringInfo(&cmd, - "SELECT DISTINCT" - " (CASE WHEN (array_length(gpt.attrs, 1) = c.relnatts)" - " THEN NULL ELSE gpt.attrs END)" - " FROM pg_publication p," - " LATERAL pg_get_publication_tables(p.pubname) gpt," - " pg_class c" - " WHERE gpt.relid = %u AND c.oid = gpt.relid" - " AND p.pubname IN ( %s )", - lrel->remoteid, - pub_names->data); + "SELECT CASE WHEN cardinality(r.prattrs) <> relnatts THEN " + "r.prattrs END FROM pg_class c " + "LEFT JOIN LATERAL (SELECT DISTINCT prattrs FROM " + "pg_publication_rel r INNER JOIN pg_publication p " + "ON p.oid = r.prpubid WHERE c.oid = r.prrelid AND " + "pubname in ( %s )) r ON TRUE WHERE c.oid = %u", + pub_names->data, + lrel->remoteid); pubres = walrcv_exec(LogRepWorkerWalRcvConn, cmd.data, lengthof(attrsRow), attrsRow); @@ -983,13 +981,13 @@ fetch_remote_table_info(char *nspname, char *relname, LogicalRepRelation *lrel, /* Check for row filters. */ resetStringInfo(&cmd); appendStringInfo(&cmd, - "SELECT DISTINCT pg_get_expr(gpt.qual, gpt.relid)" - " FROM pg_publication p," - " LATERAL pg_get_publication_tables(p.pubname) gpt" - " WHERE gpt.relid = %u" - " AND p.pubname IN ( %s )", - lrel->remoteid, - pub_names->data); + "SELECT pg_get_expr(r.prqual, r.prrelid) FROM pg_class c " + "LEFT JOIN LATERAL (SELECT DISTINCT prqual, prrelid FROM " + "pg_publication_rel r INNER JOIN pg_publication p ON " + "p.oid = r.prpubid WHERE r.prrelid = c.oid AND " + "p.pubname IN ( %s )) r ON TRUE WHERE c.oid = %u", + pub_names->data, + lrel->remoteid); res = walrcv_exec(LogRepWorkerWalRcvConn, cmd.data, 1, qualRow); -- 2.51.0.windows.1